#include "model/clases/Atributo.h"

Atributo::Atributo(
		std::string tipoDato,
		Visibilidad visibilidad,
		std::string nombre,
		bool estatico,
		std::string valor) {

	this->tipoDato = tipoDato;
	this->visibilidad = visibilidad;
	this->nombre = nombre;
	this->estatico = estatico;
	this->nombre = nombre;
	this->valor = valor;
}

Atributo::Atributo() {

	this->tipoDato = "void";
	this->nombre = "Atributo";
	this->estatico = false;
	this->valor = "";
}

Atributo::Atributo(const Atributo & att) {

	this->tipoDato = att.getTipoDato();
	this->nombre = att.getNombre();
	this->estatico = att.estatico;
	this->valor = att.getValor();
	this->visibilidad = att.getVisibilidad();
}

std::string Atributo::getTipoDato() const {
    return tipoDato;
}

std::string Atributo::getNombre() const {
    return nombre;
}

Visibilidad Atributo::getVisibilidad()const{
    return visibilidad;
}

std::string Atributo::getValor()const{
    return valor;
}

void Atributo::serialize(XmlWriter & writer_rep, XmlWriter & writer_comp){

	/* Serializo mis parametros */
	Utils utils;
	xmlNode* comp_hijo = writer_comp.addCurrentNodeChild(NODE_ATTRIBUTE, "");
	writer_comp.addProperty(comp_hijo, TARGET_NAME, nombre.c_str());
	writer_comp.addProperty(comp_hijo, "atName", nombre.c_str());
	writer_comp.addProperty(comp_hijo, "dataType", tipoDato.c_str());
	writer_comp.addProperty(comp_hijo, "static", estatico==true?"true":"false");
	writer_comp.addProperty(comp_hijo, "visibility", utils.visibilidadToString(visibilidad).c_str());

}

void Atributo::deserialize(XmlReader & reader){}

void Atributo::deserialize(XmlReader & reader, XmlReader & readerModel){

	std::string nombre = readerModel.getCurrentNodeProperty(TARGET_NAME);
	this->setName(nombre);

	std::string atName = readerModel.getCurrentNodeProperty("atName");
	this->nombre = atName;

	std::string dataType = readerModel.getCurrentNodeProperty("dataType");
	this->tipoDato = dataType;

	std::string isStatic = readerModel.getCurrentNodeProperty("static");
	if (isStatic.compare("true")) this->estatico = true;
	if (isStatic.compare("false")) this->estatico = false;

	std::string visib = readerModel.getCurrentNodeProperty("visibility");
	Visibilidad v = Utils::crearVisivilidadStringToEnum()[visib];
	this->visibilidad = v;
}

Atributo::~Atributo() {

}

std::string Atributo::description() {
	std::string d = "";
	d += Utils::visibilidadToString(this->visibilidad);
	d += " " + this->nombre;
	d += " : " + (tipoDato.size() ? tipoDato : "void");
	return d;
}
